一、前言:
在前幾天,我們依序完成了底層的 SavePointManager、動態存檔清單生成,以及流暢的 Toggle 開關與生命週期防呆。但一些遊戲開發的基礎功能往往最怕「換場景失效」!當玩家進入遊戲關卡後,如果想要隨時打開選單讀檔或調整設定,卻發現面板跟著標題場景一起消失,那就尷尬了。
所以今天【Day 19】我們要進行全系列最關鍵的架構升級:
1. DontDestroyOnLoad 跨場景常駐機制: 讓核心管理物件與 UI 跨越場景邊界,切換關卡也不會被銷毀。
2. 標準 Singleton 單例防呆: 確保跨場景載入時不會重複生成多個分身。
3. 全域 UI 總成配置: 將跨場景會用到的設定選單與動態面板納入常駐架構中。
二、核心程式實作:打造常駐管理器 (PersistentUI.cs)
我們在專案中建立 PersistentUI.cs,並掛載到負責常駐的根物件上。採用最標準且安全的單例防呆架構:
using UnityEngine;
public class PersistentUI : MonoBehaviour {
// 確保靜態實例存在
public static PersistentUI Instance;
void Awake() {
// 經典且安全的單例防呆
if (Instance == null) {
Instance = this;
DontDestroyOnLoad(gameObject);
Debug.Log("===> " + gameObject.name + " 已成功標記為【持久化】! <===");
}
else {
// 如果已經存在舊的 Instance,就把這個剛才新冒出來的分身銷毀
Debug.LogWarning(gameObject.name + " 偵測到重複,已銷毀重複實例。");
Destroy(gameObject);
}
}
}
三、Unity 編輯器配置步驟(Hierarchy 總成示範):
1. 建立常駐根節點: 在標題場景(Title Scene)的根目錄建立一個空物件,命名為 PersistentManagers(或 PersistentUI),並將腳本掛載上去。
2. 配置子物件與 UI 總成:
將我們的 Canvas(內含 Setting、SettingPanel 與 SaveSelectPanel 等功能按鈕)拖曳成為常駐根節點的子物件。
圖一、架構示意圖

圖二、Setting與其功能已可常駐在後續幕數(以第三幕為例)
四、架構避坑與實戰小撇步:
五、今日成果與小結
DAY19的內容獨立出來開一個全新的分支 feature/persistent-managers
1.檢查目前修改狀態
git status
2.建立並切換至新的獨立分支:
git checkout -b feature/persistent-managers
3.將今天的程式碼與修改加入暫存區並提交 Commit:
git add .
git commit -m "feat: 實作 PersistentUI 跨場景常駐管理器,結合 DontDestroyOnLoad 與 Singleton 確保 UI 總成不滅"
4.將新分支推送到遠端倉庫:
git push origin feature/persistent-managers